﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
//using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using System.Threading;

namespace OpenEPNClient
{
    public partial class fen_Process : Form
    {
        private int prav, prapr;
        string[] m_processName;
        
        public string[] processName
        {
            get { return m_processName; }
        }


        public fen_Process()
        {
            InitializeComponent();
        }

        public void actulis()
        {
          listView1.Items.Clear();            
          string nom = "", chemin = "", mem = "", date = ""; // le Nom et le chemin du Processus
          m_processName = new string[Process.GetProcesses().Length];
          int i = 0;
            
            foreach (Process proc in Process.GetProcesses() )
            {
                try
                {    // la recuperation des infos
                    nom = proc.ProcessName;
                    chemin = proc.MainModule.FileName;
                    mem = (proc.WorkingSet64/ 1024).ToString()+ " Ko";
                    date = proc.StartTime.ToString();

                }
                catch (Exception) // si le chemin est invalide
                {
                    chemin = ""; // en assigne la chaine vide au chemin

                }

                finally // l'ajout des infos a la Listeview
                { 
                 listView1.Items.Add(new ListViewItem (new string []{nom,chemin,mem,date}));
                 m_processName.SetValue(nom, i);
                 i++;
                }

            }
              // La recuperation du nombre de processus actifs 
            nbproc.Text = Convert.ToString(Process.GetProcesses().Length) + " Processus en Cours d'execution";
              
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            actulis(); // une actialisation au debut Biensure ;)
            prav = Process.GetProcesses().Length;
            prapr = prav;

            
        }

        private void timer1_Tick(object sender, EventArgs e)
        {   // une actualisation en fonction d'un tick du timer
            prapr = Process.GetProcesses().Length;
            if (prapr != prav)
            {
                actulis();
                prav = prapr;
            }

           
        }

        private void arreterLeProcessusToolStripMenuItem_Click(object sender, EventArgs e)
        {
            foreach (Process proc in Process.GetProcesses())
            {
                if ((proc.ProcessName == listView1.FocusedItem.Text) & (listView1.FocusedItem.SubItems[1].Text != ""))
                {
                    DialogResult msg = MessageBox.Show("Attention: terminer un processus peut provoquer l'instabilité du System \n Voulez vous vraiment terminer ce processus", "Avertissement", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
                    if (msg == DialogResult.OK)
                    {
                        try
                        {
                            proc.Kill(); // l'arret du processus 
                        }
                        catch (Exception) // si le processus est critique 
                        {
                            MessageBox.Show("Impossible de terminer ce processus, il s'agit d'un processus system", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Hand);

                        }

                    }

                }
            
            }
            // une actualisation apres modification de la liste est necessaire
            actulis();

        }

        private void ouvrirLeRepertoireDuProcessusToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (listView1.FocusedItem.SubItems[1].Text != "")
            {
                try
                {    //la recuperation du Chemin d'acces
                    FileInfo chemin = new FileInfo(listView1.FocusedItem.SubItems[1].Text);
                    string dir = chemin.DirectoryName;
                    Process.Start("Explorer","/e,"+dir);
                }
                catch(Exception ee)
                {  // le chemin d'acces est invalide
                MessageBox.Show("Le gestionnaire ne peut pas ouvrir le repertoire\n"+ee.Message,"Erreur",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
                }

            }

        }

      
        
        
        private void sauvgarderLaListeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            saveFileDialog1.ShowDialog();
            //Affiche le SaveFileDialogue
            
                  
        }

        private void actualiserLaListeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            actulis();
        }

        private void quiterToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit(); // Quitter l'application
        }

        private void exe() // pour lancer executer
        {
            //executer dlg = new executer();
            //dlg.ShowDialog();
        }

        private void lancerUnProgrammeToolStripMenuItem_Click(object sender, EventArgs e)
        {

            Thread exc = new Thread(new ThreadStart (exe));
            exc.Start(); // Lancer executer Dans un Thread separé et independant du process-manager
           
        }

        private void lancerMsConfigToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Process.Start("msconfig");// Lutilitaire de configuration Systeme

        }

        private void lancerLediteurDuRegistreToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Process.Start("regedit"); // L'editeur de Registre
        }

        private void aProposToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Process Manager\nPar Mohamed Zaki", "A Propos ...", MessageBoxButtons.OK, MessageBoxIcon.Information);

        }

        private void saveFileDialog1_FileOk(object sender, CancelEventArgs e)
        {
            string date = DateTime.Now.ToString(); //recuperation de la date et l'heure lors de la sauvgarde
         
            StreamWriter wr = new StreamWriter(saveFileDialog1.FileName);//Creation Du fichier De Sauvgarde
            ListView.ListViewItemCollection liste = listView1.Items; //Les items de la listeView
            wr.WriteLine(" Liste Sauvgardée le :" + date);
            foreach (ListViewItem item in liste) // L'ecriture Des infos dans le fichier
            {
                wr.WriteLine("*" + item.SubItems[0].Text + " : " + item.SubItems[1].Text);

            }
            wr.WriteLine("********Fin de la liste********");
            wr.Close(); // Fermeture Du fichier
            MessageBox.Show("  Sauvgarde effecuée   ", "ok", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);



        }

        


    }
}
